﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Security.Cryptography;
using System.IO;

namespace CommonUtil
{
    public class EncryptHelper
    {
        /// <summary> 
        /// 获得MD5加密后的字符串（不可逆） 
        /// </summary> 
        /// <param name="password">明码</param> 
        /// <returns></returns> 
        public static string GetPassword(string password)
        {
            string result = "";
            MD5 md5 = MD5.Create();//实例化一个md5对像 
            // 加密后是一个字节类型的数组，这里要注意编码UTF8/Unicode等的选择　 
            byte[] s = md5.ComputeHash(Encoding.UTF8.GetBytes(password));
            // 通过使用循环，将字节类型的数组转换为字符串，此字符串是常规字符格式化所得 
            for (int i = 0; i < s.Length; i++)
            {
                // 将得到的字符串使用十六进制类型格式。格式后的字符是小写的字母，如果使用大写（X）则格式后的字符是大写字符  
                result = result + s[i].ToString("X");
            }
            return result;
        }
        /// <summary> 
        /// 获得Des加密后字符串 
        /// </summary> 
        /// <param name="data">待加密字符</param> 
        /// <param name="keyCode1">密钥</param> 
        /// <param name="keyCode2">密钥</param> 
        /// <returns></returns> 
        public static string DesEncode(string data, string keyCode1, string keyCode2)
        {
            byte[] byKey = GetKey(keyCode1);
            byte[] byIV = GetKey(keyCode2);
            DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
            int i = cryptoProvider.KeySize;
            MemoryStream ms = new MemoryStream();
            CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateEncryptor(byKey, byIV), CryptoStreamMode.Write);
            StreamWriter sw = new StreamWriter(cst);
            sw.Write(data);
            sw.Flush();
            cst.FlushFinalBlock();
            sw.Flush();
            return Convert.ToBase64String(ms.GetBuffer(), 0, (int)ms.Length);
        }
        /// <summary> 
        /// 获得Des解密后字符串 
        /// </summary> 
        /// <param name="data">待解密字符串</param> 
        /// <param name="keyCode1">密钥</param> 
        /// <param name="keyCode2">密钥</param> 
        /// <returns></returns> 
        public static string DesDecode(string data, string keyCode1, string keyCode2)
        {
            byte[] byKey = GetKey(keyCode1);
            byte[] byIV = GetKey(keyCode2);
            byte[] byEnc;
            try
            {
                byEnc = Convert.FromBase64String(data);
            }
            catch
            {
                return null;
            }
            DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
            MemoryStream ms = new MemoryStream(byEnc);
            CryptoStream cst = new CryptoStream(ms, cryptoProvider.CreateDecryptor(byKey, byIV), CryptoStreamMode.Read);
            StreamReader sr = new StreamReader(cst);
            return sr.ReadToEnd();
        }

        private static byte[] GetKey(string keyCode)
        {            
            return Encoding.Default.GetBytes(keyCode);
        }
    }
}
